//CPZ Gimmicks

freeslot("MT_CPZBLOB_SPAWN", "MT_CPZBLOB", "MT_CPZBLOB_SPAWN2", "MT_CPZBLOB2", "MT_CPZBLOB_SPAWN_PARA1", "MT_CPZBLOB_SPAWN_PARA2", "MT_CPZBLOB3")

mobjinfo[MT_CPZBLOB_SPAWN] = {
        doomednum = 453,
        spawnstate = S_INVISIBLE,
        spawnhealth = 9999,
        radius = 16*FRACUNIT,
        height = 16*FRACUNIT,
        dispoffset = 0,
        mass = 100,
        damage = 0,
        flags = MF_SCENERY|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPTHING
}

mobjinfo[MT_CPZBLOB_SPAWN2] = {
        doomednum = 454,
        spawnstate = S_INVISIBLE,
        spawnhealth = 9999,
        radius = 16*FRACUNIT,
        height = 16*FRACUNIT,
        dispoffset = 0,
        mass = 100,
        damage = 0,
        flags = MF_SCENERY|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPTHING
}

mobjinfo[MT_CPZBLOB_SPAWN_PARA1] = {
        doomednum = 455,
        spawnstate = S_INVISIBLE,
        spawnhealth = 9999,
        radius = 16*FRACUNIT,
        height = 16*FRACUNIT,
        dispoffset = 0,
        mass = 100,
        damage = 0,
        flags = MF_SCENERY|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPTHING
}

mobjinfo[MT_CPZBLOB_SPAWN_PARA2] = {
        doomednum = 456,
        spawnstate = S_INVISIBLE,
        spawnhealth = 9999,
        radius = 16*FRACUNIT,
        height = 16*FRACUNIT,
        dispoffset = 0,
        mass = 100,
        damage = 0,
        flags = MF_SCENERY|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPTHING
}

mobjinfo[MT_CPZBLOB] = {
        doomednum = -1,
        spawnstate = S_BLUESPHERE,
        spawnhealth = 9999,
        speed = 0,
        radius = 16*FRACUNIT,
        height = 24*FRACUNIT,
        dispoffset = 0,
        mass = DMG_WATER,
        damage = 0,
        flags = MF_SCENERY|MF_PAIN|MF_NOGRAVITY
}

mobjinfo[MT_CPZBLOB2] = {
        doomednum = -1,
        spawnstate = S_BLUESPHERE,
        spawnhealth = 9999,
        speed = 0,
        radius = 16*FRACUNIT,
        height = 24*FRACUNIT,
        dispoffset = 0,
        mass = DMG_WATER,
        damage = 0,
        flags = MF_PAIN|MF_NOGRAVITY
}

mobjinfo[MT_CPZBLOB3] = {
        doomednum = -1,
        spawnstate = S_BLUESPHERE,
        spawnhealth = 9999,
        speed = 0,
        radius = 16*FRACUNIT,
        height = 24*FRACUNIT,
        dispoffset = 0,
        mass = DMG_WATER,
        damage = 0,
        flags = MF_SCENERY|MF_PAIN
}

addHook("MobjSpawn", function(mo)
mo.color = SKINCOLOR_PURPLE
mo.colorized = true
end, MT_CPZBLOB)

addHook("MobjSpawn", function(mo)
mo.color = SKINCOLOR_PURPLE
mo.colorized = true
end, MT_CPZBLOB2)

addHook("MobjSpawn", function(mo)
mo.color = SKINCOLOR_PURPLE
mo.colorized = true
end, MT_CPZBLOB3)

//Source Code Port
local function P_ParabolaEpta(actor, target_x, target_y, target_z, speed)
local x = target_x
local y = target_y
local z = target_z
local dh
x = $1 - actor.x
y = $1 - actor.y
z = $1 - actor.z
dh = P_AproxDistance(x, y)
actor.momx = FixedMul(FixedDiv(x, dh), speed)
actor.momy = FixedMul(FixedDiv(y, dh), speed)
	if not gravity
	return
	end
dh = FixedDiv(FixedMul(dh, gravity), speed)
actor.momz = (dh>>1) + FixedDiv(z, dh<<1)
end

addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_CPZBLOB_SPAWN
		if mo.numberblob == nil
		mo.numberblob = 5
		end
		if mo.spawnblob == nil
		//mo.spawnblob = 15
			if mo.spawnpoint
			mo.spawnblob = 15+(mo.spawnpoint.extrainfo*(TICRATE/15))
			else
				if mo.autoconfig == nil
				mo.autoconfig = 5
				else
					if mo.autoconfig > 0
					mo.autoconfig = $1 - 1
					else
					mo.spawnblob = 10
					mo.autoconfig = nil
					end
				end
			end
		else
			if mo.spawnblob > 0
			mo.spawnblob = $1 - 1
				if mo.spawnblob == 2
				and mo.numberblob > 0
				S_StartSound(mo, sfx_s25a)
				P_SpawnMobjFromMobj(mo, 0, 0, 0, MT_CPZBLOB)
				mo.spawnblob = 6
				mo.numberblob = $1 - 1
				end
			else
			mo.spawnblob = TICRATE+15
			mo.numberblob = 5
			end
		end
	end
end, MT_CPZBLOB_SPAWN)

addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_CPZBLOB_SPAWN2
		if mo.numberblob == nil
		mo.numberblob = 5
		end
		if mo.spawnblob == nil
		//mo.spawnblob = 15
			if mo.spawnpoint
			mo.spawnblob = 15+(mo.spawnpoint.extrainfo*(TICRATE/15))
			else
				if mo.autoconfig == nil
				mo.autoconfig = 5
				else
					if mo.autoconfig > 0
					mo.autoconfig = $1 - 1
					else
					mo.spawnblob = 10
					mo.autoconfig = nil
					end
				end
			end
		else
			if mo.spawnblob > 0
			mo.spawnblob = $1 - 1
				if mo.spawnblob == 2
				and mo.numberblob > 0
				S_StartSound(mo, sfx_s25a)
				P_SPMAngle(mo, MT_CPZBLOB2, mo.angle)
				mo.spawnblob = 6
				mo.numberblob = $1 - 1
				end
			else
			mo.spawnblob = TICRATE+15
			mo.numberblob = 5
			end
		end
	end
end, MT_CPZBLOB_SPAWN2)

addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_CPZBLOB_SPAWN_PARA1
		if mo.numberblob == nil
		mo.numberblob = 5
		end
		if mo.spawnblob == nil
		//mo.spawnblob = 15
			if mo.spawnpoint
			mo.spawnblob = 15+(mo.spawnpoint.extrainfo*(TICRATE/15))
			end
		else
			if mo.spawnblob > 0
			mo.spawnblob = $1 - 1
				if mo.spawnblob == 2
				and mo.numberblob > 0
				S_StartSound(mo, sfx_s25a)
					for mt in mapthings.iterate
						if mt
						and mt.valid
						and mt.type == 456
							if mt.angle == mo.spawnpoint.angle
							local dist = R_PointToDist2(mo.x, mo.y, mt.x*FRACUNIT, mt.y*FRACUNIT)
							local blob = P_SpawnMobjFromMobj(mo, 0, 0, FRACUNIT, MT_CPZBLOB3)
								if blob
								and blob.valid
								//P_ParabolaEpta(blob, mt.mobj.x, mt.mobj.y, mt.mobj.z, 8*FRACUNIT)
								P_ParabolaEpta(blob, mt.mobj.x, mt.mobj.y, mt.mobj.z, dist/32)
								end
							end
						end
					end
				mo.spawnblob = 6
				mo.numberblob = $1 - 1
				end
			else
			mo.spawnblob = TICRATE+15
			mo.numberblob = 5
			end
		end
	end
end, MT_CPZBLOB_SPAWN_PARA1)

addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_CPZBLOB
	and mo.health
	P_SetObjectMomZ(mo, 8*FRACUNIT)
		if (mo.eflags & MFE_VERTICALFLIP)
			if mo.z <= mo.floorz
			P_KillMobj(mo)
			end
		else
			if mo.z+mo.height >= mo.ceilingz
			P_KillMobj(mo)
			end
		end
	end
end, MT_CPZBLOB)

addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_CPZBLOB2
	and mo.health
	P_InstaThrust(mo, mo.angle, 8*FRACUNIT)
	end
end, MT_CPZBLOB2)

addHook("MobjMoveBlocked", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_CPZBLOB2
	and mo.health
	P_KillMobj(mo)
	end
end, MT_CPZBLOB2)

addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_CPZBLOB3
	and mo.health
		if P_IsObjectOnGround(mo)
		P_KillMobj(mo)
		end
	end
end, MT_CPZBLOB3)